package day04;

/*
多态：
    子类的对象，既是子类这个类型的，也是父类这个类型的。具有多种形态。
    子类对象可以当做父类的对象来使用，但是父类不能当做子类来使用。
    dog是Dog的实例，可以看成Dog类型，也可以看做Pet类型。
    pet是Pet的实例，不能看做Dog类型，宠物不一定是宠物狗。

    Fish、Cat 从Pet继承，也可以用doctor方法。
 */
public class Demo04 {
    // 给宠物看病的方法
    public static void doctor(Pet pet) {
        if (pet.getHealth() < 60) {
            System.out.println("给Pet看病：打针吃药");
            pet.setHealth(pet.getHealth() + 10);
        } else {
            System.out.println("给Pet做保健：洗澡按摩");
            pet.setHealth(pet.getHealth() + 2);
        }
    }

    // 给狗看病的方法
    public static void dogDoctor(Dog dog) {
        if (dog.getHealth() < 60) {
            System.out.println("给Dog看病：打针吃药");
            dog.setHealth(dog.getHealth() + 10);
        } else {
            System.out.println("给Dog做保健：洗澡按摩");
            dog.setHealth(dog.getHealth() + 2);
        }
    }


    public static void main(String[] args) {
        Pet pet = new Pet("小花", 2, 45);
        System.out.println(pet);
        doctor(pet); // 可以传Pet类型的对象
        // dogDoctor(pet); // 不能传Pet类型的对象
        System.out.println(pet);

        Dog dog = new Dog("小黑", 1, 60);
        System.out.println(dog);
        doctor(dog); // 可以传Pet子类类型的对象
        dogDoctor(dog); // 可以传Dog以及Dog的子类类型的对象
        System.out.println(dog);

        // 父类的对象，使用子类来实例化。
        Pet pet1 = new Dog("小白", 1, 20);
        System.out.println(pet1);

        //Dog dog1 = new Pet("小白", 1, 20);
    }
}
